﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;               // Til parametre i sql-streng

using Controller;
using Interfaces;

namespace Controller
{
    public class DBFacaden
    {
        private SqlConnection con;
        private SqlCommand cmd;

        private LogSystem system;        // Associering til controller

        public DBFacaden(LogSystem system)
        {
            this.system = system;

            string connectionStr = connectionStr = @"Data Source=linux2.tietgen.dk;Initial Catalog=gruppe101.2;Persist Security Info=True;User ID=gruppe101.2;Password = ce2eQaCR";

            // Skab forbindelses-objekt udfra connectionStr
            con = new SqlConnection(connectionStr);

            // Skab kommando-objekt og tilknyt til forbindelses-objekt
            cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;     // Kommandotype er Stored Procedure
        }
        
        // Metode til at indlæse fra databasen
        public void IndlæsFraDatabase()
        {
            IndlæsMedarbejdere();
            IndlæsProjekter();
            IndlæsArbejdslogs();
            IndlæsArbejdslogMedarbejder();
        }

        #region Indlæs medarbejdere og projekter fra databasen

        // metode til at indlæse projekter fra databasen
        public void IndlæsProjekter()
        {
            SqlDataReader datareader;

            int projektNr;
            string titel;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsLogProjekter";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    projektNr = (int)datareader["projektNr"];
                    titel = (string)datareader["titel"];

                    system.IndlæsProjekter(projektNr, titel);    // Opret projekt-objektet i modellen
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        // metode til at indlæse medarbejdere fra databasen
        public void IndlæsMedarbejdere()
        {
            SqlDataReader datareader;

            int medarbNr;
            string navn;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsLogMedarbejdere";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    medarbNr = (int)datareader["medarbNr"];
                    navn = (string)datareader["navn"];

                    system.IndlæsMedarbejdere(medarbNr, navn);    // Opret medarbejder-objektet i modellen
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        #endregion

        #region operationer på arbejdslog-objekter

        // metode til at indlæse arbejdslogs objekter fra databasen - (med associering til projekter)
        public void IndlæsArbejdslogs()
        {
            SqlDataReader datareader;

            int arbejdslogID;
            DateTime starttidspunkt;
            DateTime sluttidspunkt;
            int tid; // Minutter
            string note;
            bool aktiv;

            int projektNr;   // til associering

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsArbejdslogs";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    arbejdslogID = (int)datareader["arbejdslogID"];
                    starttidspunkt = (DateTime)datareader["starttidspunkt"];
                    sluttidspunkt = (DateTime)datareader["sluttidspunkt"];
                    tid = (int)datareader["tid"];
                    note = (string)datareader["note"];
                    aktiv = (bool)datareader["aktiv"];
                    projektNr = (int)datareader["projektNr"];
                    
                    system.IndlæsArbejdslogs(arbejdslogID, starttidspunkt, sluttidspunkt, tid, note, aktiv, projektNr);    // Opret arbejdslog-objektet i modellen
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        // Metode til at indlæse fra ArbejdslogMedarbejder tabellen i databasen, til associering af arbejdslog og medarbejder
        public void IndlæsArbejdslogMedarbejder()
        {
            SqlDataReader datareader;

            int arbejdslogID;
            int medarbNr;

            cmd.Parameters.Clear();    // Husk selvom der ikke bruges parametre!!!

            cmd.CommandText = "LæsArbejdslogMedarbejder";

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                datareader = cmd.ExecuteReader();

                // Gennemløb datareader (result set)
                while (datareader.Read() == true)
                {
                    arbejdslogID = (int)datareader["arbejdslogID"];
                    medarbNr = (int)datareader["medarbNr"];

                    system.IndlæsArbejdslogMedarbejder(medarbNr, arbejdslogID);    // associer arbejdslog- og medarbejder-objekter i modellen
                }

                con.Close();             // Luk forbindelsen
            }
            catch (SqlException ex)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                throw ex;
            }
        }

        // metode til at oprette et arbejdslog-objekt i databasen
        public bool OpretArbejdslogMedProjekt(DateTime starttidspunkt, DateTime sluttidspunkt, int tid, string note, bool aktiv, int projektNr, out int arbejdslogID)
        {
            cmd.CommandText = "OpretArbejslogMedProjekt";

            cmd.Parameters.Clear();

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@starttidspunkt", SqlDbType.DateTime);
            par.Value = starttidspunkt;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@sluttidspunkt", SqlDbType.DateTime);
            par.Value = sluttidspunkt;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@tid", SqlDbType.Int);
            par.Value = tid;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@note", SqlDbType.NVarChar);
            par.Value = note;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@aktiv", SqlDbType.Bit);
            par.Value = aktiv;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@projektNr", SqlDbType.Int);
            par.Value = projektNr;
            cmd.Parameters.Add(par);

            // Output-parameter
            par = new SqlParameter("@arbejdslogID", SqlDbType.Int);
            par.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();     // Luk forbindelsen

                arbejdslogID = (int)cmd.Parameters["@arbejdslogID"].Value;   // arbejdslogID = output-parameter
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();
                arbejdslogID = 0;
                return false;
            }

            return true;
        }

        // Metode til at oprette en associering mellem et arbejdslog-objekt og et medarbejder-objekt i databasen
        public bool OpretArbejdslogMedarbejder(int medarbNr, int arbejdslogID)
        {
            cmd.CommandText = "OpretArbejdslogMedarbejder";

            cmd.Parameters.Clear();

            // Sæt værdier i parametre
            SqlParameter par = new SqlParameter("@medarbNr", SqlDbType.Int);
            par.Value = medarbNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@arbejdslogID", SqlDbType.Int);
            par.Value = arbejdslogID;
            cmd.Parameters.Add(par);           

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();     // Luk forbindelsen                
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                    con.Close();                
                return false;
            }

            return true;
        }

        // Metode til at redigere sluttidspunktet på et arbejdslog-objekt
        public bool RedigerSluttid(int arbejdslogID, DateTime sluttidspunkt, int tid)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "RedigerSluttidspunkt";

            cmd.Parameters.Clear();

            //sæt værdier i parametre
            SqlParameter par = new SqlParameter("@arbejdslogID", SqlDbType.Int);
            par.Value = arbejdslogID;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@sluttidspunkt", SqlDbType.DateTime);
            par.Value = sluttidspunkt;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@tid", SqlDbType.Int);
            par.Value = tid;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }
                return false;
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        // Metode til at redigere Noten på et arbejdslog-objekt
        public bool RedigerNote(int arbejdslogID, string note)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "RedigerNote";

            cmd.Parameters.Clear();

            //sæt værdier i parametre
            SqlParameter par = new SqlParameter("@arbejdslogID", SqlDbType.Int);
            par.Value = arbejdslogID;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@note", SqlDbType.NVarChar);
            par.Value = note;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }
                return false;
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        // Metode til at Redigere aktiv på et arbejdslog-objekt
        public bool RedigerAktiv(int arbejdslogID, bool aktiv)
        {
            int NoOfRowsEffected;

            cmd.CommandText = "RedigerAktiv";

            cmd.Parameters.Clear();

            //sæt værdier i parametre
            SqlParameter par = new SqlParameter("@arbejdslogID", SqlDbType.Int);
            par.Value = arbejdslogID;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@aktiv", SqlDbType.Bit);
            par.Value = aktiv;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();             // Åben forbindelsen til databasen
                NoOfRowsEffected = cmd.ExecuteNonQuery();   // Udfør kommando
                con.Close();             // Luk forbindelsen
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)          // Luk forbindelsen
                {
                    con.Close();
                }
                return false;
            }

            if (NoOfRowsEffected == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        #endregion
    }
}
